package org.club.common.util;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;

/**
 * 使用Kaptcha的验证码生成器
 */
public class KaptchaUtils {

    private DefaultKaptcha kaptcha;
    private String text;

    public KaptchaUtils() {
        kaptcha = new DefaultKaptcha();
        Properties properties = new Properties();
        // 基础配置
        properties.setProperty("kaptcha.border", "yes");  // 添加边框增加清晰度
        properties.setProperty("kaptcha.border.color", "105,179,90");  // 设置柔和的边框颜色
        properties.setProperty("kaptcha.border.thickness", "1");  // 设置适中的边框厚度
        // 文本配置
        properties.setProperty("kaptcha.textproducer.char.length", "4");  // 保持4个字符的长度
        properties.setProperty("kaptcha.textproducer.char.space", "6");  // 增加字符间距，提高可读性
        properties.setProperty("kaptcha.textproducer.font.size", "40");  // 适中的字体大小
        properties.setProperty("kaptcha.textproducer.font.color", "0,98,204");  // 使用深蓝色，提高对比度
        properties.setProperty("kaptcha.textproducer.char.string", "23456789ABCDEFGHJKLMNPQRSTUVWXYZ");  // 去除容易混淆的字符(0,1,I,O)

        // 图片配置
        properties.setProperty("kaptcha.image.width", "140");  // 适当的图片宽度
        properties.setProperty("kaptcha.image.height", "50");  // 适当的图片高度
        properties.setProperty("kaptcha.background.clear.from", "white");  // 纯白背景
        properties.setProperty("kaptcha.background.clear.to", "white");  // 纯白背景，不使用渐变
        
        // 干扰配置
        properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise");  // 移除干扰线
        properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy");  // 使用阴影效果代替扭曲
        
        // 字体配置
        properties.setProperty("kaptcha.textproducer.font.names", "Arial,Courier");  // 使用清晰的等宽字体

        Config config = new Config(properties);
        kaptcha.setConfig(config);
    }

    /**
     * 生成验证码图片
     * @return 验证码图片
     */
    public BufferedImage getImage() {
        // 生成验证码文本
        text = kaptcha.createText();
        // 生成验证码图片
        return kaptcha.createImage(text);
    }

    /**
     * 获取验证码字符串
     * @return 验证码字符串
     */
    public String getText() {
        return text;
    }

    /**
     * 输出验证码图片到流
     * @param image 验证码图片
     * @param out 输出流
     * @throws IOException 当写入操作失败时抛出
     */
    public static void output(BufferedImage image, OutputStream out) throws IOException {
        ImageIO.write(image, "JPEG", out);
    }

}